<?php
declare (strict_types=1);

namespace app\utils;


class CheckSign
{
    public static function check($param,$salt): void
    {
        $transfer_signature = $param["signature"] ?? '';
        if (empty($transfer_signature)) {
            myException('签名参数缺失');
        }
        unset($param['signature']);//去掉签名
        if ( ! empty($param)) {
            //数组排序
            ksort($param);
            $str = self::toQueryString($param);
            $self_signature = md5($str.$salt);
            if ($transfer_signature != $self_signature) {
                myException('接口签名验证失败'.$self_signature.'=='.$str);
            }
        }
    }


    private static function toQueryString($data, $parentKey = ''): string
    {
        $result = [];

        if (is_array($data) || is_object($data)) {
            foreach ($data as $key => $value) {
                // 确保键被正确保留，包括数字键（如 0）
                $currentKey = $parentKey !== '' ? "{$parentKey}[{$key}]" : $key;
                if (is_array($value) || is_object($value)) {
                    // 递归处理嵌套数组或对象
                    $nestedResult = self::toQueryString($value, $currentKey);
                    if ($nestedResult) {
                        $result[] = $nestedResult;
                    }
                } elseif ($value !== null && $value !== '') {
                    // 保留 0，跳过 null 和空字符串
                    if (is_bool($value)) {
                        $valueStr = $value ? 'true' : 'false';
                    } else {
                        $valueStr = (string)$value;
                    }
                    $result[] = "{$currentKey}={$valueStr}";
                }
                // 如果 value 是 null 或空字符串，跳过这个键值对
            }
        } elseif ($data !== null && $data !== '') {
            // 如果 data 不是数组或对象，直接处理
            if (is_bool($data)) {
                $valueStr = $data ? 'true' : 'false';
            } else {
                $valueStr = (string)$data;
            }
            $result[] = "{$parentKey}={$valueStr}";
        }

        return implode('&', $result);
    }
}